package model

import (
	"background/db"
	"background/logs"
	"background/utils"
	"crypto/md5"
	"fmt"
	"log"
	"time"

	"github.com/jinzhu/gorm"
)

type Plan struct {
	ID        uint32        `gorm:"column:id;primary_key" json:"id"`
	StartTime utils.OrmTime `gorm:"column:start_time" json:"start_time"`
	EndTime   utils.OrmTime `gorm:"column:end_time" json:"end_time"`
	Date      string        `gorm:"column:date" json:"date"`
	Content   string        `gorm:"column:content" json:"content"`
	Type      uint32        `gorm:"column:type" json:"type"`
}

type Undo struct {
	model     gorm.Model
	ID        int32      `json:"id" gorm:"column:id" sql:"id"`
	Content   string     `json:"content" gorm:"column:content" sql:"content"`
	SpendTime int32      `json:"spend_time" gorm:"column:spend_time" sql:"spend_time"`
	Parent    int32      `json:"parent" gorm:"column:parent" sql:"parent"`
	Level     int32      `json:"level" gorm:"column:level" sql:"level"`
	Type      int32      `json:"type" gorm:"column:type" sql:"type"`
	Done      int        `json:"done" gorm:"done" sql:"done"`
	DeletedAt *time.Time `json:"deleted_at"`
	CreateTime string `json:"create_time"`
	FinishTime string `json:"finish_time"`
}

type PlanType struct {
	ID       uint32 `gorm:"column:id;primary_key" json:"id"`
	TypeName string `gorm:"column:type_name;" json:"type_name"`
}

func (m *Undo) TableName() string {
	return "undo"
}
func (m *PlanType) TableName() string {
	return "plan_type"
}
func (m *Plan) TableName() string {
	return "plan"
}

type Users struct {
	ID           int64  `sql:"id" json:"id"`
	UserName     string `sql:"user_name" json:"user_name"`
	UserPwd      string `sql:"user_pwd" json:"user_pwd"`
	CreatedDate  string `sql:"created_date" json:"created_date"`
	UpdatedDate  string `sql:"updated_date" json:"updated_date"`
	DisplayName  string `sql:"display_name" json:"display_name"`
	EmailAddress string `sql:"email_address" json:"email_address"`
	Tel          string `sql:"tel" json:"tel"`
	Avatar       string `sql:"avatar" json:"avatar"`
}

func GetUsers(limit int32, offsetPage int32, name string) ([]Users, int32) {
	users := []Users{}
	var query string
	if name != "" {
		log.Println(name)
		query = fmt.Sprintf("select * from users where user_name like '%s' limit %d offset %d",
			"%%"+name+"%%", limit, offsetPage*limit)
		log.Printf(query)
	} else {
		query = fmt.Sprintf("select * from users limit %d offset %d", limit, offsetPage*limit)
	}
	err := db.GetMysqlClient().Query2(query, &users)
	if nil != err {
		logs.Error(err.Error())
	}
	type Count struct {
		Count int32 `sql:"count"`
	}
	cnts := []Count{}
	query = fmt.Sprintf("select count(*) as count from users")
	err = db.GetMysqlClient().Query2(query, &cnts)
	if nil != err {
		logs.Error(err.Error())
	}
	return users, cnts[0].Count
}

func ModyfyPassword(UserName string, Password string) error {
	h := md5.New()
	h.Write([]byte(Password))
	query := fmt.Sprintf("update users set user_pwd = '%s' where user_name = '%s' ",
		utils.ByteSliceToString(h.Sum(nil)), UserName)
	n, err := db.GetMysqlClient().Update(query)
	if nil != err {
		logs.Error(err.Error())
		return err
	}
	if n == 0 {
		return nil
	}
	return nil
}
